package edu.huangke.cglibTest;

import edu.huangke.MyAspect;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibProxy implements MethodInterceptor {


    public Object createProxy(Object object) {
        Enhancer enhancer = new Enhancer();
        // 被代理对象的类
        enhancer.setSuperclass(object.getClass());
        // 增强的具体代码实现
        enhancer.setCallback(this);
        return enhancer.create();
    }

    /**
     *
     * @param o 代理对象本身
     * @param method 被代理的方法
     * @param objects 方法需要的参数
     * @param methodProxy 代理后的方法
     * @return
     * @throws Throwable
     */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        MyAspect myAspect = new MyAspect();

        // 增强的功能
        myAspect.checkPermission();
        myAspect.log();

        // 执行原有方法
        Object result = methodProxy.invokeSuper(o, objects);

        return result;

    }
}
